Точная нарезка материала
Эту задачу описали на форуме owen.ru.
Процитирую:
- На валу двигателя транспорта подачи материала установлен энкодер с разрешением 500 имп/об
- Частота вращения двигателя - максимум 3000 об/мин (обычно 2000 об/мин)
- Двигатель работает от частотника
- Время, достаточное для подачи нужного количества материала ~0.4-0.6 сек за цикл
- Энкодер подключен к счетчику, который управляет частотником двигателя
- Двигатель низкоинерционный, остальная механика транспорта тоже. Останов происходит практически мгновенно, переезды есть, но они не критичны и их можно попытаться компенсировать программно.
От данного счетчика требуется отсчитать нужное количество импульсов и остановить двигатель. В следующем цикле счетчик должен быть обнулен до старта двигателя (переменная total в Вашем примере).
Т.е. счетчик должен уверенно и без пропусков считывать от одной фазы энкодера сигнал частотой до 30 кГц.
Если у вас открыта среда Hardella IDE, то можете либо
открыть код примера в среде, либо создать свой проект на основе примера (File
> New
> Project
> Material cutter
).
Решение
Создадим тип-перечисление для того, чтобы описывать текущее состояние системы (это делается правой кнопкой, New
> c.g.v.iec66131.types
> type alias
):
Опишем нужную логику на языке ST:
Здесь более-менее прозрачно: выполняем то или иное действие в зависимости от текущего состояния.
Если движение закончено (текущее состояние STOP
), то ждём пропадания enable
для запуска нового движения.
В начальном состоянии INIT
ждём когда установится нужная длина (runLength
) и придёт сигнал на запуск (enable
)
При движении считаем общий пробег в переменной offset
и останавливаемся, если нужная длина пройдена.
В PRU программе всго 3 строки:
- В первой вызывается блок ABZ энкодера для вычисления его положения
- Во второй строке вызываем блок нарезчика. В качестве параметра
cntr
передаётся значение счётчика импульсов на 4-ом входе. - Сигнал на включение мотора (
cutter.out
) выдаётся на 3-ый выход (out3
).
Комментировать